extends Control

@onready var health_bar = $HealthProgress
@onready var delayed_bar = $DelayedBar
@export var tween_delay: float = 0.1      # 延迟开始动画的时间
@export var tween_duration: float = 0.25   # Tween 动画持续时间

var enemy = null
var tween_active: bool = false
var tween_active_health: bool = false

# 用于保存真实的目标血量值
var target_value: float = 0

func _ready() -> void:
	delayed_bar.tint_progress = Color(0.09, 0.08, 0.00)
	set_process(true)
	enemy = get_parent()
	call_deferred("_initialize_health_bar")

func _initialize_health_bar() -> void:
	# 确保两个进度条完全重叠
	health_bar.set_anchors_preset(Control.PRESET_FULL_RECT)
	delayed_bar.set_anchors_preset(Control.PRESET_FULL_RECT)
	
	health_bar.max_value = enemy.max_health
	delayed_bar.max_value = enemy.max_health
	health_bar.value = enemy.current_health
	delayed_bar.value = enemy.current_health
	target_value = enemy.current_health

# 专门用于清空血条的方法，确保两个血条都立即显示为空
func clear_health_bar() -> void:
	# 取消所有正在进行的动画
	tween_active_health = false
	tween_active = false
	
	# 设置目标值为0
	target_value = 0
	
	# 直接设置两个血条的值为0
	health_bar.value = 0
	delayed_bar.value = 0
	
	# 使用直接的属性设置，绕过任何可能的动画系统
	if health_bar.has_method("set_value_no_signal"):
		health_bar.set_value_no_signal(0)
	if delayed_bar.has_method("set_value_no_signal"):
		delayed_bar.set_value_no_signal(0)
	
	# 强制更新UI
	if health_bar.has_method("queue_redraw"):
		health_bar.queue_redraw()
	if delayed_bar.has_method("queue_redraw"):
		delayed_bar.queue_redraw()
	
	print("血条已清空")

func set_health(current_health: float, max_health: float) -> void:
	# 更新目标血量
	target_value = current_health
	
	# 同步最大生命值
	health_bar.max_value = max_health
	delayed_bar.max_value = max_health
	
	# 如果生命值为0，立即更新两个血条，不使用动画
	if current_health <= 0:
		clear_health_bar()
		return
	
	# 对主血条进行 Tween 平滑更新
	if abs(health_bar.value - current_health) > 0.01 and not tween_active_health:
		tween_active_health = true
		var th = create_tween()
		th.set_meta("group", "health_tweens")
		th.tween_property(health_bar, "value", current_health, tween_duration) \
			.set_trans(Tween.TRANS_LINEAR).set_ease(Tween.EASE_IN_OUT)
		th.connect("finished", Callable(self, "_on_health_tween_finished"))
	else:
		health_bar.value = current_health
	
	# 延迟血条更新逻辑：以 target_value 为依据
	if delayed_bar.value > target_value and not tween_active:
		tween_active = true
		var tw = create_tween()
		tw.set_meta("group", "delay_tweens")
		tw.tween_interval(tween_delay)
		tw.tween_property(delayed_bar, "value", target_value, tween_duration) \
			.set_trans(Tween.TRANS_LINEAR).set_ease(Tween.EASE_IN_OUT)
		tw.connect("finished", Callable(self, "_on_tween_finished"))
	else:
		# 如果延迟血条值不足，直接同步（例如回血情况）
		delayed_bar.value = target_value

# 强制立即更新血条，不使用动画过渡
# 用于生命值为0等需要立即反馈的情况
func force_update() -> void:
	# 如果是死亡状态（生命值为0），使用专门的方法清空血条
	if target_value <= 0:
		clear_health_bar()
		return
	
	# 取消所有正在进行的动画
	if tween_active_health:
		# 在 Godot 4 中，我们不能通过组来获取 tween
		# 直接标记状态并立即更新值
		tween_active_health = false
	
	if tween_active:
		# 同样，直接标记状态
		tween_active = false
	
	# 立即更新两个血条到目标值
	health_bar.value = target_value
	delayed_bar.value = target_value

func _on_health_tween_finished() -> void:
	tween_active_health = false

func _on_tween_finished() -> void:
	tween_active = false
